package JmmAndMultiThread.MultiThreads;

public class MultiThreadObjectLock {
    public static void main(String[] args) {
//        1.首先创建一个 A 和 B 共享的对象锁 lock = new Object();
//        2.当 A 得到锁后，先打印 1，然后调用 lock.wait() 方法，交出锁的控制权，进入 wait 状态；
//        3.对 B 而言，由于 A 最开始得到了锁，导致 B 无法执行；直到 A 调用 lock.wait() 释放控制权后， B 才得到了锁；
//        4.B 在得到锁后打印 1， 2， 3；然后调用 lock.notify() 方法，唤醒正在 wait 的 A;
//        5.A 被唤醒后，继续打印剩下的 2，3。
        //lock
        Object lock=new Object();
        Thread thread1=new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock){
                    System.out.println(Thread.currentThread().getName()+" print:"+1);
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+" print:"+2);
                    System.out.println(Thread.currentThread().getName()+" print:"+3);
                }

            }
        },"A");
        Thread thread2=new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock){
                    System.out.println(Thread.currentThread().getName()+" print:"+1);
                    System.out.println(Thread.currentThread().getName()+" print:"+2);
                    System.out.println(Thread.currentThread().getName()+" print:"+3);
                    lock.notifyAll();
                }

            }
        }," B");
        thread1.start();
        thread2.start();
    }
}
